/**
 * Copyright (c) subnew
 * Licensed under the GPL;
 * @email:joseanluo@gmail.com
 * @Title: BaseController.java
 * @Package com.subnew.copyman.frame.web.controller
 */
package com.subnew.mango.frame.web.controller;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.validation.Validator;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import com.subnew.mango.frame.dao.EntityManager;
import com.subnew.mango.frame.dao.support.Page;
import com.subnew.mango.frame.exception.ActionException;
import com.subnew.mango.frame.exception.ExceptionEnum;
import com.subnew.mango.frame.model.common.AjaxResponse;
import com.subnew.mango.frame.model.easyui.DataGrid;
import com.subnew.mango.frame.utils.reflection.ReflectionUtils;
import com.subnew.mango.frame.utils.web.SpringmvcContextHolderUtil;

/**
 * Spring MVC Controller抽象基类<br>
 * 提供通用方法调用！！！使用公用方法的子类，必须指定驱动模型&lt;T&gt;<br>
 * 
 * @author JoseanLuo
 * @date 2014年9月2日 下午2:26:22
 * @version V1.0
 */
public abstract class BaseController<T> {
	/**
	 * 日志对象
	 */
	protected Logger logger = LoggerFactory.getLogger(getClass());
	/**
	 * 当前页
	 */
	protected int page = 1;
	/**
	 * 每页显示记录数
	 */
	protected int rows = Page.DEFAULT_PAGESIZE;
	/**
	 * 排序字段，多个以‘,’分隔，与order数目必须相等
	 */
	protected String sort;
	/**
	 * 排序方式，多个以‘,’分隔，与sort数目必须相等
	 */
	protected String order = Page.ASC;
	/**
	 * 实体
	 */
	protected Class<T> entityClass;

	/**
	 * 验证Bean实例对象
	 */
	@Autowired
	protected Validator validator;

	protected BaseController() {
		this.entityClass = ReflectionUtils.getClassGenricType(getClass());
	}

	/**
	 * EntityManager.
	 */
	public abstract EntityManager<T, Long> getEntityManager();

	/**
	 * 
	 * 通过ID查找对象
	 * 
	 * @param pk
	 *            id
	 * @param model
	 *            前台MODEL
	 * @throws ActionException
	 * @Title: findByPk
	 * @author JoseanLuo
	 * @date 2014年9月9日 下午8:30:28
	 * @version V1.0
	 */
	@RequestMapping(value = { "findByPk" })
	public void findByPk(@RequestParam(value = "pk", required = true) Long pk, Model model) throws ActionException {
		// 输入检验
		if (null == pk) {
			logger.error("方法findByPk出错，pk不能为空！！！");
			throw new ActionException(ExceptionEnum.ACTION_40001);

		}
		if (null == model) {
			logger.error("方法findByPk出错，model不能为空！！！");
			throw new ActionException(ExceptionEnum.ACTION_40002);
		}

		// 业务逻辑
		T entity = getEntityManager().findByPk(pk);
		if (null == entity) {
			logger.error("ID为[" + pk + "]的记录不存在或已被其它用户删除！");
			throw new ActionException(ExceptionEnum.ACTION_40003);
		}

		// 结果返回
		model.addAttribute("model", entity);

	}

	/**
	 * 
	 * 保存对象<br>
	 * 访问上下文doSave
	 * 
	 * @param model
	 * @return aJaxResponse
	 * @throws ActionException
	 * @Title: doSave
	 * @author JoseanLuo
	 * @date 2014年9月11日 上午9:46:31
	 * @version V1.0
	 */
	@RequestMapping(value = { "doSave" })
	@ResponseBody
	public AjaxResponse doSave(T model) throws ActionException {
		// 输入检验
		if (null == model) {
			logger.error("方法doSave出错，model不能为空！！！");
			throw new ActionException(ExceptionEnum.ACTION_40002);
		}

		// 业务逻辑
		AjaxResponse response = new AjaxResponse();
		getEntityManager().save(model);
		response.setCode("0");
		response.setMessage("保存成功!");

		// 结果返回
		return response;
	}

	/**
	 * 
	 * 通过ID删除指定对象
	 * 
	 * @param id
	 * @return
	 * @throws ActionException
	 * @Title: doDelete
	 * @author JoseanLuo
	 * @date 2014年9月11日 上午9:55:19
	 * @version V1.0
	 */
	@RequestMapping(value = { "doDelete" })
	@ResponseBody
	public AjaxResponse doDelete(Long pk) throws ActionException {
		// 输入检验
		if (null == pk) {
			logger.error("方法doDelete出错，pk不能为空！！！");
			throw new ActionException(ExceptionEnum.ACTION_40002);
		}

		// 业务逻辑
		AjaxResponse ajaxResponse = new AjaxResponse();
		getEntityManager().delete(pk);
		ajaxResponse.setCode("0");
		ajaxResponse.setMessage("删除成功！");

		// 结果返回
		return ajaxResponse;
	}

	/**
	 * 
	 * TODO
	 * 
	 * @param pks
	 * @return
	 * @throws ActionException
	 * @Title: doDeletes
	 * @author JoseanLuo
	 * @date 2014年9月11日 上午10:18:18
	 * @version V1.0
	 */
	public AjaxResponse doDeletes(List<Long> pks) throws ActionException {
		// 输入检验
		if (null == pks || pks.size() == 0) {
			logger.error("方法doDeletes出错，pks不能为空！！！");
			throw new ActionException(ExceptionEnum.ACTION_40002);
		}
		// 业务逻辑
		AjaxResponse ajaxResponse = new AjaxResponse();
		getEntityManager().deleteByPks(pks);
		ajaxResponse.setCode("0");
		ajaxResponse.setMessage("删除成功！");

		// 结果返回
		return ajaxResponse;
	}
    /**
     * 
    * 获取DataGrid.
    * @param page 第几页
    * @param rows 页面大小
    * @param sort 排序字段
    * @param order 排序方式
    * @return DataGRID
    * @throws ActionException  
    * @Title: doList
    * @author JoseanLuo  
    * @date 2014年9月11日 上午11:06:52
    * @version V1.0
     */
	@RequestMapping(value={"doList"})
	@ResponseBody
	public DataGrid<T> doList(@RequestParam(value="page",defaultValue="1")int page,@RequestParam(value="rows",defaultValue=Page.DEFAULT_PAGESIZE+"") int rows, String sort, String order) throws ActionException {

		return null;
	}
	
	/**
	 * 
	* 跳转JSP页面
	* 测试方式，
	* @param folder 路径
	* @param jspName JSP名称(不加后缀)
	* @return  
	* @Title: redirectJsp
	* @author JoseanLuo  
	* @date 2014年9月11日 上午11:24:49
	* @version V1.0
	 */
	@RequestMapping("/{folder}/{jspName}")
    public String redirectJsp(@PathVariable String folder, @PathVariable String jspName) {
        logger.info("页面跳转到："+folder+"/"+jspName);
        return "/" + folder + "/" + jspName;
    }
	/**
	 * 
	* 取得HttpServletRequest
	* @return  HttpServletRequest
	* @Title: getRequest
	* @author JoseanLuo  
	* @date 2014年9月15日 下午11:55:28
	* @version V1.0
	 */
	public  HttpServletRequest getRequest(){
		return SpringmvcContextHolderUtil.getRequest();
	}

	/**
	 * 
	* 取得HttpSession
	* @return  HttpSession
	* @Title: getSession
	* @author JoseanLuo  
	* @date 2014年9月15日 下午11:57:20
	* @version V1.0
	 */
	public HttpSession getSession(){
		return getRequest().getSession();
	}
}
